package controller

import (
	"fmt"
	"strconv"
	"strings"
)

var (
	reportMap = map[string]map[string]string{
		"高血压": {
			"1": "I级高血压范围为140-159/90-99mmHg，I级高血压如果不存在其他危险因子（吸烟、糖尿病、心房颤动、血脂异常、缺乏身体活动、肥胖、高同型半胱氨酸血症），危险分层属低危状态，首先采用非药物治疗，包括低盐饮食、减肥、戒烟、劳逸结合，多参加体力活动等，如3-6个月的非药物治疗血压仍高，考虑药物治疗。您的情况还需到门诊进一步诊治。",
			"2": "血压160-179/100-109mmHg为高血压II级，II级高血压必须药物治疗。坚持治疗，把血压控制在正常或基本正常水平。平时注意监测血压，低盐低脂饮食，忌烟限酒，控制体重注意劳逸结合，保持稳定情绪，生活规律。",
			"3": "血压≥180/110mmHg为高血压III级。预示对心、脑、肾的损害大。如存在其他多项危险因子（吸烟、糖尿病、心房颤动、血脂异常、缺乏身体活动、肥胖、高同型半胱氨酸血症），危险分层属高危状态，需积极地加强治疗。建议您平时应注意低盐低脂饮食；忌烟限酒；坚持适量活动；控制体重；定期监测血压，内科随诊。",
			"4": "既往高血压病史，本次血压 G/D mmHg。高血压是动脉粥样硬化和冠心病的重要危险因素，也是心力衰竭的重要原因，如存在其他多项危险因子（吸烟、糖尿病、心房颤动、血脂异常、缺乏身体活动、肥胖、高同型半胱氨酸血症），危险分层属于高危状态，需积极地加强治疗。建议您<br>（1）继续口服药物治疗，监测血压，使血压控制在140/90mmHg以下。<br>（2）治疗性生活方式干预：控制体重，将BMI值尽可能控制在小于24kg/m2，每日食盐量以不超过6g为宜；多食新鲜蔬菜和水果；减少食用油摄入，少吃或不吃肥肉和动物内脏；增加运动，稳定血压；减轻精神压力，保持心态平衡；必要时补充叶酸制剂。",
		},
		"糖尿病": {
			"1": "本次体检血糖值高，建议您复查血糖，随诊。",
			"2": "既往糖尿病病史，本次体检血糖XTmmol/L，建议您<br>（1）继续降糖治疗，每3个月复查糖化血红蛋白、尿微量白蛋白、眼底。<br>（2）低脂低盐糖尿病饮食：①三餐尽量定时、定量（主食2两/餐）；②青菜不限量随便吃；③每天1个鸡蛋，2两瘦肉；④若要喝稀饭，尽量稀稀的，滚熟即可；⑤炒菜尽量少放油盐；⑥两餐之间有饥饿感时应立即测血糖，若血糖不低，应进食黄瓜等蔬菜，若血糖低，应立即进食，调整降糖药的用量；⑦红薯、胡萝卜、土豆、山药、芋头等根茎类食物尽量少吃，若进食的话，应减少主食量；粉条为淀粉类，对血糖影响大，少食⑧禁食：甜食、油炸食品及肥肉，禁食花生、核桃、瓜子、杏仁等坚果类食品。<br>（3）运动：餐后1小时可慢走30分钟左右，根据身体状况定。",
			"3": "本次体检查糖化血红蛋白XHDB﹪，（稍高）提示近期（2-3月）血糖水平有波动，本次空腹血糖为mmol/L（稍高），建议监测空腹及餐后2小时血糖，按照糖尿病饮食，饮食生活方式干预，避免进展为糖尿病。",
			"4": "既往糖尿病史，本次体检血糖XTmmol/L，糖化血红蛋白XHDB％。建议您<br>（1）继续降糖治疗，监测空腹及餐后血糖，使空腹血糖控制在7.1mmol/L以下，餐后2小时血糖控制在11.1mmol/L以下，糖化血红蛋白控制在9％以下，3个月查一次糖化血红蛋白，眼底。<br>（2）糖尿病饮食：主食不超过250g（粗细粮搭配），食油20-25g/日，奶类250g/日，少食高热量食物，多食新鲜蔬菜，适量水果。<br>（3）坚持运动：每周至少3-5次，每次30-60分钟，宜中等量有氧运动。<br>（4）保持健康的生活的方式：如戒烟酒，膳食平衡，生活规律，心态平和。",
		},
		"高血脂症": {
			"1": "本次体检甘油三脂偏高，低密度脂蛋白偏高。低密度脂蛋白被公认是动脉粥样硬化的主要致病因素，称为致动脉硬化脂蛋白。因此低密度脂蛋白能增加心脑血管疾病的风险。建议您：<br>（1）在医师指导下调脂治疗，将低密度脂蛋白控制在2.6mmol/L以下，甘油三脂控制在1.7mmol/L以下，3-6个月复查血脂。<br>（2）合理饮食：少食高脂食物、动物脂肪、动物内脏、油炸食品，粗细粮搭配，多食用新鲜的蔬菜。<br>（3）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
			"2": "本次体检甘油三脂稍高、高密度脂蛋白稍低、低密度脂蛋白稍高。低密度脂蛋白被公认是动脉粥样硬化的主要致病因素，称为致动脉硬化脂蛋白。因此低密度脂蛋白能增加心脑血管疾病的风险。建议您：<br>（1）在医师指导下调脂治疗，将甘油三脂控制在1.7mmol/L以下，高密度密度脂蛋白控制在1.0mmol/L以上，低密度脂蛋白控制在2.6mmol/L以下，3-6个月复查血脂。<br>（2）合理饮食：少食高脂食物、动物脂肪、动物内脏、油炸食品，粗细粮搭配，多食用新鲜的蔬菜。<br>（3）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
			"3": "本次体检总胆固醇偏高，甘油三脂偏高，建议您<br>（1）在医师指导下调脂治疗，将总胆固醇控制在4.14mmol/L以下，甘油三脂控制在1.7mmol/L以下，3-6个月复查血脂。<br>（2）合理饮食：少食高脂食物、动物脂肪、动物内脏、油炸食品，粗细粮搭配，多食用新鲜的蔬菜。<br>（3）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
			"4": "本次体检总胆固醇偏高，甘油三脂偏高，低密度脂蛋白偏高。低密度脂蛋白被公认是动脉粥样硬化的主要致病因素，称为致动脉硬化脂蛋白。因此低密度脂蛋白能增加心脑血管疾病的风险。建议您：<br>（1）在医师指导下调脂治疗，将总胆固醇控制在4.14mmol/L以下，低密度脂蛋白控制在2.6mmol/L以下，甘油三脂控制在1.7mmol/L以下，3-6个月复查血脂。<br>（2）合理饮食：少食高脂食物、动物脂肪、动物内脏、油炸食品，粗细粮搭配，多食用新鲜的和水果蔬菜。<br>（3）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
			"5": "本次体检总胆固醇偏高，甘油三脂偏高，低密度脂蛋白偏高，高密度脂蛋白偏低。低密度脂蛋白被公认是动脉粥样硬化的主要致病因素，称为致动脉硬化脂蛋白。因此低密度脂蛋白能增加心脑血管疾病的风险。建议您：<br>（1）在医师指导下调脂治疗，将总胆固醇控制在4.14mmol/L以下，甘油三脂控制在1.7mmol/L以下，高密度密度脂蛋白控制在1.0mmol/L以上，低密度脂蛋白控制在2.6mmol/L以下，3-6个月复查血脂。<br>（2）如果不合并其他高危因素（糖尿病、高血压、冠心病等），建议您饮食运动控制，3个月后复查血脂。<br>（3）如合并颈动脉斑块形成或者高危因素，建议您在医师指导下服用他汀类降脂药物，定期复查血脂，合理饮食，坚持运动。<br>（4）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
			"6": "本次体检总胆固醇偏高，甘油三脂偏高，高密度脂蛋白偏低，建议您<br>（1）在医师指导下调脂治疗，将总胆固醇控制在4.14mmol/L以下，甘油三脂控制在1.7mmol/L以下，高密度密度脂蛋白控制在1.0mmol/L以上，3-6个月复查血脂。<br>（2）合理饮食：少食高脂食物、动物脂肪、动物内脏、油炸食品，粗细粮搭配，多食用新鲜的蔬菜。<br>（3）在无特殊疾病情况下，坚持有氧运动（如跑步、步行、骑车、游泳），每周5次，每次至少30分钟以上。",
		},
		"同型半胱氨酸": {
			"1": "本次体检同型半胱氨酸偏高，血同型半胱氨酸偏高是心脑血管疾病的独立危险因素。建议您<br>（1）调整饮食结构，均衡膳食，少食动物蛋白，适量多摄入五谷杂粮及新鲜蔬菜水果。<br>（2）必要时在内科医师综合评估指导下服用叶酸、维生素B12、维生素B6等治疗，（6-12个月）复查。",
		},
		"BMI": {
			"1": "本次体检您的体重指数（BMI)超出正常值（18.5-23.9kg/m2），BMI≥28kg/m2为肥胖，肥胖增加糖尿病、心脑血管疾病的风险，建议您低脂低盐清淡饮食，坚持运动，控制体重在TZ公斤左右。肥胖症是指人体进食热量多于消耗热量时，多余热量以脂肪的形式储存在体内，当体内脂肪堆积过多和（或）分布异常，体重增加的一种多因素慢性代谢性疾病，体重指数BMI值大于28kg/m2，定义为肥胖。<br>（1）加强饮食控制和运动，体重控制在正常范围内。<br>（2）病因治疗。",
		},
		"颈动脉斑块": {
			"1": "彩超提示颈部血管斑块，斑块可造成血管狭窄，硬化斑块表面破裂、溃疡、脱落后形成栓子，造成脑梗塞，是脑卒中的发病原因。建议您<br>（1）在专科医生指导下应用他汀类药物及阿司匹林类药物治疗，稳定斑块，抗血小板治疗。<br>（2）控制血压、血糖、血脂水平。<br>（3）饮食上少盐多醋，多食洋葱黑木耳等软化血管的食物，坚持适量运动，规律作息。<br>（4）定期复查血脂、血糖、血管彩超，神经内科随诊。",
		},
	}
)

func displaySBPAndDSP(physicalCheckup, pastMedicalHistory map[string]interface{}) (string, string, string) {
	gaoxueya_1 := physicalCheckup["tigejiancha_xueya_firstSBP"]
	dixueya_1 := physicalCheckup["tigejiancha_xueya_firstDSP"]
	gaoxueya_2 := physicalCheckup["tigejiancha_xueya_secondSBP"]
	dixueya_2 := physicalCheckup["tigejiancha_xueya_secondDSP"]
	var (
		_gaoxueya_1, _dixueya_1, _gaoxueya_2, _dixueya_2 int64
		firstSBP, firstDSP, gxyDisplayResultForPage      string
		gxyResult                                        int
	)
	if gaoxueya_1 != nil {
		_gaoxueya_1, _ = strconv.ParseInt(gaoxueya_1.(string), 10, 64)
	}
	if dixueya_1 != nil {
		_dixueya_1, _ = strconv.ParseInt(dixueya_1.(string), 10, 64)
	}
	if gaoxueya_2 != nil {
		_gaoxueya_2, _ = strconv.ParseInt(gaoxueya_2.(string), 10, 64)
	}
	if dixueya_2 != nil {
		_dixueya_2, _ = strconv.ParseInt(dixueya_2.(string), 10, 64)
	}
	t := _gaoxueya_1
	if _gaoxueya_1 < _gaoxueya_2 {
		t = _gaoxueya_2
	}
	firstSBP = displayXueYa(t, 90, 140)

	t = _dixueya_1
	if _dixueya_1 < _dixueya_2 {
		t = _dixueya_2
	}
	firstDSP = displayXueYa(t, 60, 90)
	gxyResult = gxyCheck(int(_gaoxueya_1), int(_dixueya_1), int(_gaoxueya_2), int(_dixueya_2))
	switch gxyResult {
	case 1:
		gxyDisplayResultForPage = reportMap["高血压"]["1"]
	case 2:
		gxyDisplayResultForPage = reportMap["高血压"]["2"]
	case 3:
		gxyDisplayResultForPage = reportMap["高血压"]["3"]
	case 0:
		if pastMedicalHistory != nil && len(pastMedicalHistory) > 0 {
			gaoxueya_ := pastMedicalHistory["gaoxueya"]
			if gaoxueya_ != nil && gaoxueya_ == "有" {
				gxyDisplayResultForPage = reportMap["高血压"]["4"]
				gxyDisplayResultForPage = strings.Replace(gxyDisplayResultForPage, "G", firstSBP, -1)
				gxyDisplayResultForPage = strings.Replace(gxyDisplayResultForPage, "D", firstDSP, -1)
			}
		}
	}
	return firstSBP, firstDSP, gxyDisplayResultForPage
}

/*高血压检查*/
func gxyCheck(gaoxueya_1, dixueya_1, gaoxueya_2, dixueya_2 int) int {
	firstSBPResult := SBPCheck(gaoxueya_1)
	firstDBPResult := DBPCheck(dixueya_1)
	secondSBPResult := SBPCheck(gaoxueya_2)
	secondDBPResult := DBPCheck(dixueya_2)

	firstFinalResult := firstSBPResult
	if firstSBPResult < firstDBPResult {
		firstFinalResult = firstDBPResult
	}
	secondFinalResult := secondSBPResult
	if secondSBPResult < secondDBPResult {
		secondFinalResult = secondDBPResult
	}
	result := firstFinalResult
	if firstFinalResult < secondFinalResult {
		result = secondFinalResult
	}
	return result
}

func displayXueYa(v int64, min, max int64) string {
	shang := fmt.Sprintf("<span style='size: 20px;color: #ff0000;font-weight: bold;'>&nbsp;↑</span>")
	xia := fmt.Sprintf("<span style='size: 20px;color: #ff0000;font-weight: bold;'>&nbsp;↓</span>")

	html := fmt.Sprintf("<span>%d</span>", v)
	if v < min || v > max {
		html = fmt.Sprintf("<span class='yichang'>%d</span>", v)
		if v < min {
			html = html + xia
		} else if v > max {
			html = html + shang
		}
	}
	return html
}

/**
生成报告中BMI方法
*/
func displayBMI(val string, min, max float64) string {

	shang := fmt.Sprintf("<span style='size: 20px;color: #ff0000;font-weight: bold;'>&nbsp;↑</span>")
	xia := fmt.Sprintf("<span style='size: 20px;color: #ff0000;font-weight: bold;'>&nbsp;↓</span>")
	v, _ := strconv.ParseFloat(val, 64)
	html := fmt.Sprintf("<span>%.2f</span>", v)
	if v < min || v > max {
		html = fmt.Sprintf("<span class='yichang'>%.2f</span>", v)
		if v < min {
			html = html + xia
		} else if v > max {
			html = html + shang
		}
	}
	return html
}

func SBPCheck(SBP int) int {
	if 140 <= SBP && SBP <= 159 {
		return 1
	}
	if 160 <= SBP && SBP <= 179 {
		return 2
	}
	if 180 <= SBP {
		return 3
	}
	return 0
}

func DBPCheck(DBP int) int {
	if 90 <= DBP && DBP <= 99 {
		return 1
	}
	if 100 <= DBP && DBP <= 109 {
		return 2
	}
	if 110 <= DBP {
		return 3
	}
	return 0
}
